/**
 * 394. 字符串解码
 * 中等
 * 相关标签
 * conpanies icon
 * 相关企业
 * 给定一个经过编码的字符串，返回它解码后的字符串。
 *
 * 编码规则为: k[encoded_string]，表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
 *
 * 你可以认为输入字符串总是有效的；输入字符串中没有额外的空格，且输入的方括号总是符合格式要求的。
 *
 * 此外，你可以认为原始数据不包含数字，所有的数字只表示重复的次数 k ，例如不会出现像 3a 或 2[4] 的输入。
 *
 * 测试用例保证输出的长度不会超过 105。
 *
 *
 *
 * 示例 1：
 *
 * 输入：s = "3[a]2[bc]"
 * 输出："aaabcbc"
 * 示例 2：
 *
 * 输入：s = "3[a2[c]]"
 * 输出："accaccacc"
 * 示例 3：
 *
 * 输入：s = "2[abc]3[cd]ef"
 * 输出："abcabccdcdcdef"
 * 示例 4：
 *
 * 输入：s = "abc3[cd]xyz"
 * 输出："abccdcdcdxyz"
 *
 *
 * 提示：
 *
 * 1 <= s.length <= 30
 * s 由小写英文字母、数字和方括号 '[]' 组成
 * s 保证是一个 有效 的输入。
 * s 中所有整数的取值范围为 [1, 300]
 */
/**
 * @param {string} s
 * @return {string}
 */
const decodeString = function (s) {
  // 3[a]2[bc]
  const sk = []

  let segment = ''
  let segmentCnt = 0

  for (const ch of s) {
    // extract segmentCnt
    if (!isNaN(ch)) {
      segmentCnt *= 10
      segmentCnt += parseInt(ch, 10)
      continue
    }

    // [ sk.push(segmentCnt)
    if (ch === '[') {
      sk.push(segment)
      segment = ''

      sk.push(segmentCnt)
      segmentCnt = 0

      continue
    }

    // extract segment
    if (ch !== ']') {
      segment += ch
      continue
    }

    // calc
    if (ch === ']') {
      const cnt = sk.pop()
      let r = sk.pop()
      r += segment.repeat(cnt)
      segment = r
    }
  }

  return segment
}

function isDigit(c) {
  return c.charCodeAt(0) >= 48 && c.charCodeAt(0) <= 57
}

function isLetter(c) {
  return (
    (c.charCodeAt(0) >= 65 && c.charCodeAt(0) <= 90) ||
    (c.charCodeAt(0) >= 97 && c.charCodeAt(0) <= 122)
  )
}

console.log(decodeString('3[a]2[bc]')) // aaabcbc
console.log(decodeString('3[a2[c]]')) // accaccacc
